Avoids crash on dereference of poll_mask after domain_kill().
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
if ( init_status & INIT_gnttab )
grant_table_destroy(d);
if ( init_status & INIT_evtchn )
+ {
evtchn_destroy(d);
+ evtchn_destroy_final(d);
+ }
if ( init_status & INIT_rangeset )
rangeset_domain_destroy(d);
if ( init_status & INIT_xsm )
if ( d->target != NULL )
put_domain(d->target);
+ evtchn_destroy_final(d);
+
xfree(d->pirq_mask);
xfree(d->pirq_to_evtchn);
d->evtchn[i] = NULL;
}
spin_unlock(&d->event_lock);
+}
+
+void evtchn_destroy_final(struct domain *d)
+{
#if MAX_VIRT_CPUS > BITS_PER_LONG
xfree(d->poll_mask);
d->poll_mask = NULL;
#endif
}
+
static void domain_dump_evtchn_info(struct domain *d)
{
unsigned int port;
#endif
};
-int evtchn_init(struct domain *d);
-void evtchn_destroy(struct domain *d);
+int evtchn_init(struct domain *d); /* from domain_create */
+void evtchn_destroy(struct domain *d); /* from domain_kill */
+void evtchn_destroy_final(struct domain *d); /* from complete_domain_destroy */
struct vcpu
{